#!/bin/bash

# HashGen.sh - 使用Poseidon哈希算法生成dataHash（与电路保持一致）
# 用法: ./HashGen.sh

set -e  # 遇到错误时退出

# 检查input.json文件是否存在
if [ ! -f "input.json" ]; then
    echo "错误: input.json文件不存在"
    exit 1
fi

# 检查jq是否安装
if ! command -v jq &> /dev/null; then
    echo "错误: 需要安装jq工具来处理JSON文件"
    echo "请运行: sudo apt-get install jq"
    exit 1
fi

# 检查node是否安装
if ! command -v node &> /dev/null; then
    echo "错误: 需要安装Node.js来运行Poseidon哈希"
    echo "请运行: sudo apt-get install nodejs npm"
    exit 1
fi

# 检查circomlibjs是否安装
if [ ! -d "node_modules/circomlibjs" ]; then
    echo "错误: 需要circomlibjs库来计算Poseidon哈希"
    echo "请运行: npm install circomlibjs"
    exit 1
fi

echo "正在从input.json读取preImage..."

# 从input.json中提取preImage的值
PRE_IMAGE=$(jq -r '.preImage' input.json)

if [ "$PRE_IMAGE" = "null" ] || [ -z "$PRE_IMAGE" ]; then
    echo "错误: 无法从input.json中读取preImage"
    exit 1
fi

echo "preImage: $PRE_IMAGE"

# 使用Poseidon哈希算法计算preImage
echo "正在使用Poseidon哈希算法计算..."

# 创建临时的Node.js脚本来计算Poseidon哈希
cat > temp_poseidon.js << 'EOF'
const { buildPoseidon } = require('circomlibjs');

// 读取命令行参数
const preImage = process.argv[2];
if (!preImage) {
    console.error('错误: 缺少preImage参数');
    process.exit(1);
}

async function calculatePoseidonHash() {
    try {
        // 构建Poseidon哈希函数
        const poseidon = await buildPoseidon();
        
        // 将preImage转换为BigInt
        const preImageBigInt = BigInt(preImage);
        
        // 计算Poseidon哈希
        const hash = poseidon([preImageBigInt]);
        
        // 输出结果
        console.log(poseidon.F.toString(hash));
    } catch (error) {
        console.error('错误: Poseidon哈希计算失败:', error.message);
        process.exit(1);
    }
}

// 运行异步函数
calculatePoseidonHash();
EOF

# 运行Node.js脚本计算Poseidon哈希
DATA_HASH_DECIMAL=$(node temp_poseidon.js "$PRE_IMAGE")

# 检查计算是否成功
if [ $? -ne 0 ] || [ -z "$DATA_HASH_DECIMAL" ]; then
    echo "错误: Poseidon哈希计算失败"
    rm -f temp_poseidon.js
    exit 1
fi

# 清理临时文件
rm -f temp_poseidon.js

echo "Poseidon哈希值: $DATA_HASH_DECIMAL"

# 更新input.json文件中的dataHash字段
echo "正在更新input.json..."
jq --arg hash "$DATA_HASH_DECIMAL" '.dataHash = $hash' input.json > input_temp.json && mv input_temp.json input.json

echo "完成！已更新input.json中的dataHash字段"
echo "新的Poseidon dataHash值: $DATA_HASH_DECIMAL"
echo "注意: 此哈希值与电路中的Poseidon算法兼容"

# 显示更新后的文件内容
echo "\n更新后的input.json内容:"
cat input.json